package ejb;

import Entities.Especial;
import Entities.MenuEjecutivo;
import Entities.Producto;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class ProductoFacade extends FacadeAbstracto<Producto> implements ProductoFacadeLocal {

    @PersistenceContext(unitName = "SGR-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ProductoFacade() {
        super(Producto.class);
    }

    /**
     * 
     * @param rango
     * @return lista de productos sin menu ejecutivo ni especiales
     * @throws Exception 
     */
    @Override
    public List<Producto> buscarRangoProducto(int[] rango) throws Exception {

        List<Producto> lista = super.buscarRango(rango);
        List<Producto> listaaux = new ArrayList<>();
        for (Iterator<Producto> it = lista.iterator(); it.hasNext();) {
            Producto producto = it.next();
            if (!(producto instanceof Especial) && !(producto instanceof MenuEjecutivo) && producto.isActivo()) {
                listaaux.add(producto);
            }

        }
        return listaaux;

    }
    /**
     * Consulta para obtener el resultado de los productos que no son especiales ni menu ejecutivo
     * @return long
     * @throws Exception 
     */
        public Long contarProd() throws Exception
    {
        Long resu = new Long(0);
        Query q = em.createNativeQuery("SELECT count(*) FROM producto p where dtype ='Producto'");
        resu =  (Long) q.getSingleResult();
        return resu;
    }

    public List<Producto> buscarConParametrosProd(List<Condicional> condicionales, String adicional, int[] rango) throws Exception {
//  
        List<Producto> lista;
        lista = super.buscarConParametros(condicionales, adicional, rango);
        List<Producto> listaaux = new ArrayList<>();
        for (Iterator<Producto> it = lista.iterator(); it.hasNext();) {
            Producto producto = it.next();
            if (!(producto instanceof Especial) && !(producto instanceof MenuEjecutivo) && producto.isActivo()) {
                listaaux.add(producto);
            }

        }
        return listaaux;


    }

    /**
     * 
     * @param cat parametro para actualizar
     * @return  devuelve la lista de productos activos que no son ni especiales ni menu ejecutivo. 
     */
    @Override
    public List<Producto> ProductosPorCategira(Integer cat) {
        Query q = em.createNamedQuery("todosProductosCategoria");
        q.setParameter("idCat", cat);
        List<Producto> lista = q.getResultList();
        List<Producto> listaaux = new ArrayList<>();
        for (Iterator<Producto> it = lista.iterator(); it.hasNext();) {
            Producto producto = it.next();
            if (!(producto instanceof Especial) && !(producto instanceof MenuEjecutivo) && (producto.isActivo())) {
                
                listaaux.add(producto);
            }

        }
        return listaaux;
    }
}
